查看原文
其他

RecyclerView | 在 RecyclerView 中使用 header 快人一步

Android Android 开发者 2021-08-05
本文是介绍 RecyclerView 入门基础系列文章的第四篇。如果您已经对创建 RecyclerView 有了一定的认识,请继续阅读本文。如果尚未熟悉,建议您首先阅读本系列中的第一篇文章

您可以通过在 RecyclerView 中添加 Header 来为应用数据补充上下文信息。虽然您也可以在 LinearLayout 中将 TextView 置于 RecyclerView 之上来模拟 header 的效果,但是这个模拟的 header 在用户滑动屏幕的时候甚至是滑到列表底部的时候仍然会驻留在屏幕上。而使用真正的 header 元素,您可以实现在用户滑动 RecyclerView 的时候,header 随之移动到屏幕之外。

本文中的示例会在 RecyclerView 中添加 Header,列表中会显示不同类型的花。Header 显示 "Flower Finder",并且显示列表中花的数量。


创建 header 布局


创建一个布局文件,其中定义 Header 的展示效果。

1<!-- Copyright 2019 Google LLC. 
2   SPDX-License-Identifier: Apache-2.0 -->
3
4<LinearLayout
5  xmlns:android="http://schemas.android.com/apk/res/android"
6  android:orientation="vertical"
7  android:layout_width="match_parent"
8  android:layout_height="wrap_content">
9
10  <TextView
11    android:id="@+id/header_text"
12    android:layout_width="wrap_content"
13    android:layout_height="wrap_content"
14    android:layout_gravity="center"
15    android:text="@string/flower_finder"
16    android:textAppearance="?attr/textAppearanceHeadline3" />
17
18  <TextView
19    android:id="@+id/flower_number_text"
20    android:layout_width="wrap_content"
21    android:layout_height="wrap_content"
22    android:layout_gravity="center"
23    android:textAppearance="?attr/textAppearanceHeadline6" />
24
25  <TextView
26    android:id="@+id/flower_text"
27    android:layout_width="wrap_content"
28    android:layout_height="wrap_content"
29    android:layout_gravity="center"
30    android:text="@string/flower_string"
31    android:textAppearance="?attr/textAppearanceHeadline6" />
32
33</LinearLayout>



创建 HeaderAdapter 和 HeaderViewHolder



创建新文件来请求并且绑定 Header 的视图。

HeaderAdapter 继承自 RecyclerView.Adapter<RecyclerView.ViewHolder>()
1<!-- Copyright 2019 Google LLC. 
2   SPDX-License-Identifier: Apache-2.0 -->
3
4class HeaderAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>(){
5
6}

HeaderAdapter 中,添加一个继承自 RecyclerView.ViewHolderViewHolder。如果您需要动态更新文本,添加一个变量代表需要更新内容的 TextView。创建 bind() 函数来使用传入的字符串更新 TextView。
1<!-- Copyright 2019 Google LLC. 
2   SPDX-License-Identifier: Apache-2.0 -->
3
4class HeaderViewHolder(view: View) : RecyclerView.ViewHolder(view){
5  private val flowerNumberTextView: TextView = itemView
6    .findViewById(R.id.flower_number_text)
7
8  fun bind(flowerCount: Int) {
9    flowerNumberTextView.text = flowerCount.toString()
10  }
11}

在类定义中,修改 Adapter 的参数表以接收 HeaderViewHolder
1<!-- Copyright 2019 Google LLC. 
2   SPDX-License-Identifier: Apache-2.0 -->
3
4class HeaderAdapter: RecyclerView.Adapter<HeaderAdapter.HeaderViewHolder>() {
5
6}

由于 Adapter 继承自 RecyclerView.Adapter,它需要实现 onCreateViewHolder()onBindViewHolder()getItemCount()
  • onCreateViewHolder() 负责填充视图并且返回 HeaderViewHolder
  • getItemCount() 仅返回数值 1,因为仅有一个 Header 元素
  • onBindViewHolder() 将数据绑定到 Header
1<!-- Copyright 2019 Google LLC. 
2   SPDX-License-Identifier: Apache-2.0 -->
3
4override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HeaderViewHolder {
5    val view = LayoutInflater.from(parent.context)
6        .inflate(R.layout.header_item, parent, false)
7    return HeaderViewHolder(view)
8}
9
10override fun onBindViewHolder(holder: HeaderViewHolder, position: Int) {
11    holder.bind(flowerCount)
12}
13
14override fun getItemCount()Int {
15    return 1
16}


在 Activity 类中使用 ConcatAdapter



Activity 类中,创建一个变量代表 HeaderAdapter(),并将其置于 RecyclerViewAdapter 之上。
1<!-- Copyright 2019 Google LLC. 
2   SPDX-License-Identifier: Apache-2.0 -->
3
4val headerAdapter = HeaderAdapter()
5val flowersAdapter = FlowersAdapter { flower -> adapterOnClick(flower) }

然后使用 ConcatAdapter 将这两个 adapter 添加到 RecyclerViewConcatAdapter 会依次显示多个Adapter 的内容。在 flowersAdapter 之前添加 headerAdapter

  • ConcatAdapter

    https://developer.android.google.cn/reference/androidx/recyclerview/widget/ConcatAdapter

1<!-- Copyright 2019 Google LLC. 
2   SPDX-License-Identifier: Apache-2.0 -->
3
4val concatAdapter = ConcatAdapter(headerAdapter, flowersAdapter)
5recyclerView.adapter = concatAdapter

运行代码。大功告成!添加 Header 就是这么简单。



下一步



关于 Header完整示例代码,请查阅:

https://github.com/android/views-widgets-samples/tree/main/RecyclerViewKotlin


感谢阅读 RecyclerView 系列的最后一篇。如果您尚未阅读本系列中的其它文章,欢迎查阅以下列表并阅读。

免费中文系列课程下载

系统地学习使用 Kotlin 进行 Android 开发


☟ 即刻了解课程详情 ☟



 点击屏末 | 阅读原文 | 即刻了解如何在 RecyclerView 中添加原生的 Header



推荐阅读

如页面未加载,请刷新重试


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存